package modelo.catastrofe;

import java.util.ArrayList;

import modelo.Randomizador;
import modelo.interfaces.ConstruibleTerrestre;
import modelo.mapa.Borde;
import modelo.mapa.Este;
import modelo.mapa.Mapa;
import modelo.mapa.Norte;
import modelo.mapa.Oeste;
import modelo.mapa.Sur;
import modelo.mapa.Ubicacion;

public class Godzilla extends Catastrofe{
	
	private Borde bordeDeInicio;
	private ArrayList<Ubicacion> ubicacionesDondePasaGodzilla;	
	static final int norte = 0;
	static final int oeste = 1;
	static final int sur = 2;
	static final int este = 3;
	static final int MovimientoRecto = 0;
	static final int MovimientoDiagonal = 1;
	static final int MovimientoZigZag = 2;
	
	public Godzilla()
	{	
		super();
	}
	
	//CONSTRUCTOR SOLO PARA TESTS!! 
	public Godzilla(Ubicacion unaUbicacion, int numeroDeBorde, int numeroDeMovimiento)
	{	
		this.ubicacionDondeSeOrigina = unaUbicacion;
		if(numeroDeBorde == 0)
		{
			this.bordeDeInicio = new Norte(unaUbicacion);
		}
		else
		{
			if(numeroDeBorde == 1)
			{
				this.bordeDeInicio = new Oeste(unaUbicacion);
			}
			else
			{
				if(numeroDeBorde == 2)
				{
					this.bordeDeInicio = new Sur(unaUbicacion);
				}
				else
				{
					if(numeroDeBorde == 3)
					{
						this.bordeDeInicio = new Este(unaUbicacion);
					}
				}
			}
		}
		
		if(numeroDeMovimiento == 0)
		{
			this.generarDanioEnRecto();
		}
		else
		{
			if(numeroDeMovimiento == 1)
			{
				this.generarDanioEnDiagonal();
			}
			else
			{
				if(numeroDeMovimiento == 2)
				{
					this.generarDanioEnZigZag();
				}
				
			}
		}
		
	}
	
	protected void daniar(ConstruibleTerrestre construccionQueAfectara) 
	{		
		if (construccionQueAfectara != null)
		{
			construccionQueAfectara.recibirDanio(this);
		}
	}

	@Override
	public Ubicacion obtenerUbicacionDeOrigenDeLaCatastrofe() 
	{
		int bordeDeInicio = Randomizador.generarRandom(4); //para obtener en que borde empieza
		int numeroDeFilaDeOrigen =  Randomizador.generarRandom(Mapa.getInstance().obtenerCantidadFilas()); 
		int numeroDeColumnaDeOrigen = Randomizador.generarRandom(Mapa.getInstance().obtenerCantidadColumnas()); 
		int coordXDeOrigen = 0;
		int coordYDeOrigen = 0;
		if (bordeDeInicio == norte)
		{
			
			coordYDeOrigen = numeroDeColumnaDeOrigen;
			this.bordeDeInicio = new Norte(new Ubicacion(coordXDeOrigen,coordYDeOrigen));
		}
		else
		{
			if (bordeDeInicio == oeste)
			{
				coordXDeOrigen = numeroDeFilaDeOrigen;
				this.bordeDeInicio = new Oeste(new Ubicacion(coordXDeOrigen,coordYDeOrigen));

			}
			else
			{
				if (bordeDeInicio == sur)
				{
					coordXDeOrigen = (Mapa.getInstance().obtenerCantidadFilas() - 1);
					coordYDeOrigen = numeroDeColumnaDeOrigen;
					this.bordeDeInicio = new Sur(new Ubicacion(coordXDeOrigen,coordYDeOrigen));

				}
				else
				{
					if (bordeDeInicio == este)
					{
						
						coordXDeOrigen = numeroDeFilaDeOrigen;
						coordYDeOrigen = (Mapa.getInstance().obtenerCantidadColumnas() - 1);
						this.bordeDeInicio = new Este(new Ubicacion(coordXDeOrigen,coordYDeOrigen));

					}
				}
			}
		}
		return (new Ubicacion(coordXDeOrigen,coordYDeOrigen));		
	}
	
	private void daniarSegunMovimiento()
	{
		int tipoDeMovimiento = Randomizador.generarRandom(3);
		if (tipoDeMovimiento == MovimientoRecto)
		{
			this.generarDanioEnRecto();
		}
		else
		{
			if (tipoDeMovimiento == MovimientoDiagonal)
			{
				this.generarDanioEnDiagonal();
			}
			else
			{
				if (tipoDeMovimiento == MovimientoZigZag)
				{
					this.generarDanioEnZigZag();
				}
			}
		}
	}

	private void generarDanioEnZigZag() 
	{	
		RecorridoZigZag recorridoZigZag = new RecorridoZigZag(this.ubicacionDondeSeOrigina,this.bordeDeInicio);
		this.ubicacionesDondePasaGodzilla = recorridoZigZag.obtenerRecorridoDeGodzilla();
		for(Ubicacion ubicacionADaniar : this.ubicacionesDondePasaGodzilla)
		{
			this.daniar(Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionADaniar).obtenerConstruccionTerrestre());
		}		
	}

	private void generarDanioEnDiagonal() 
	{		
		RecorridoDiagonal recorridoDiagonal = new RecorridoDiagonal(this.ubicacionDondeSeOrigina,this.bordeDeInicio);
		this.ubicacionesDondePasaGodzilla = recorridoDiagonal.obtenerRecorridoDeGodzilla();
		for(Ubicacion ubicacionADaniar : this.ubicacionesDondePasaGodzilla)
		{
			this.daniar(Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionADaniar).obtenerConstruccionTerrestre());
		}
	}
	
	private void generarDanioEnRecto() 
	{
		RecorridoRecto recorridoRecto = new RecorridoRecto(this.ubicacionDondeSeOrigina,this.bordeDeInicio);
		this.ubicacionesDondePasaGodzilla = recorridoRecto.obtenerRecorridoDeGodzilla();
		for(Ubicacion ubicacionADaniar : this.ubicacionesDondePasaGodzilla)
		{
			this.daniar(Mapa.getInstance().obtenerHectareaSegunUbicacion(ubicacionADaniar).obtenerConstruccionTerrestre());
		}
	}

	@Override
	protected void afectar() 
	{
		ubicacionesDondePasaGodzilla = new ArrayList<Ubicacion>();
		this.daniarSegunMovimiento();
	}

	public ArrayList<Ubicacion> getDondeAfectoGodzilla()
	{
		return this.ubicacionesDondePasaGodzilla;
	}
}